package com.memoir.jpa.service;

import com.memoir.jpa.model.TodoDto;
import com.memoir.jpa.repository.TodoJpaRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.ExampleMatcher;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author ldm
 * @since 2017-11-21
 */
@Service
public class TodoJpaService {

    //省略以下方法
    //  T getOne(ID var1);
    //List<T> findAll();
    //List<T> findAll(Sort var1);
    //List<T> findAll(Iterable<ID> var1);

    //  void deleteInBatch(Iterable<T> var1);
    //  void deleteAllInBatch();

    //    <S extends T> S findOne(Example<S> var1);
    //    <S extends T> Iterable<S> findAll(Example<S> var1);
    //    <S extends T> Iterable<S> findAll(Example<S> var1, Sort var2);
    //    <S extends T> Page<S> findAll(Example<S> var1, Pageable var2);
    //    <S extends T> List<S> findAll(Example<S> var1);
    //    <S extends T> List<S> findAll(Example<S> var1, Sort var2);


    //  <S extends T> List<S> save(Iterable<S> var1);
    //  <S extends T> S saveAndFlush(S var1);
    //  void flush();

    //    <S extends T> long count(Example<S> var1);
    //    <S extends T> boolean exists(Example<S> var1);

    @Autowired
    private TodoJpaRepository todoJpaRepository;

    public List<TodoDto> findAllByExample(TodoDto todoDto){

        ExampleMatcher todoDtoMatcher = ExampleMatcher.matchingAll()    //matchingAny下的条件均用or拼接
                .withIgnorePaths("id")   //忽略某个属性
                .withIgnoreNullValues() //null值不拼接
                .withIgnoreCase()       //全局配置忽略大小写
                .withStringMatcher(ExampleMatcher.StringMatcher.ENDING) //全局配置匹配方式，后缀匹配
                .withMatcher("title",matcher -> matcher.startsWith())
                .withMatcher("content", matcher -> matcher.ignoreCase().contains());

        Example<TodoDto> todoDtoExample = Example.of(todoDto,todoDtoMatcher);

        return todoJpaRepository.findAll(todoDtoExample);
    }

    public TodoDto save(TodoDto todoDto){

        TodoDto  newTodoDto = todoJpaRepository.saveAndFlush(todoDto);  //存在1条修改，不存在增加1条,flush意味着立即插入数据库

//        todoJpaRepository.flush();
        return newTodoDto;
    }
}
